package generics;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by L.jp
 * Description:
 * User: 86189
 * Date: 2022-10-07
 * Time: 22:24
 */
//通配符的使用
public class TestWildcard {
    /*在没有通配符的时候：
    下面的a方法，相当于方法的重复定义，报错*/
   /*  public void a(List<Object> list){
    }
    public void a(List<String> list){
    }
    public void a(List<Integer> list){
    }*/
}
class Test1{
    public static void main(String[] args) {
        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<Integer> list3 = new ArrayList<>();
        List<?> list = null;
        //多态
        //加入通配符？后，G<?>就变成了 G<A>和G<B>的父类
        list = list1;
        list = list2;
        list = list3;
    }
}
//使用通配符
class Test2 {
    /*public void a(List<Object> list){
    }
    public void a(List<String> list){
    }
    public void a(List<Integer> list){
    }*/
    public void a(List<?> list){
        //内部遍历的时候用Object即可，不用？
        for(Object a:list){
            System.out.println(a);
        }
    }
}
class T{
    //这是main方法，程序的入口
    public static void main(String[] args) {
        Test2 t = new Test2();
        t.a(new ArrayList<Integer>());
        t.a(new ArrayList<String>());
        t.a(new ArrayList<Object>());
    }
}

//使用通配符的细节
class Test3 {
    public void a(List<?> list){
        //1.遍历：
        for(Object a:list){
            System.out.println(a);
        }
        //2.数据的写入操作 ：
        //list.add("abc");-->出错，不能随意的添加数据，在调用的a方法的地方传入的泛型参数不一定是String类型
        list.add(null);
        //3.数据的读取操作：利用Object类型接收
        Object s = list.get(0);
    }
}
class T3{
    //这是main方法，程序的入口
    public static void main(String[] args) {
        Test3 t = new Test3();
        t.a(new ArrayList<Integer>());
        t.a(new ArrayList<String>());
        t.a(new ArrayList<Object>());
    }
}